package com.gxa.ssm340.aspect;

import com.gxa.ssm340.anno.RequiresPermission;
import com.gxa.ssm340.exception.BizException;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;

import java.lang.reflect.Method;

/**
 * 设计一个切面
 * @author Lenovo
 */
//@Aspect
//@Component
public class PermissionAspect {

    /**
     * 声明切点
     * 要定义切点的完整路径信息:全部的包名+类名+方法（访问权限）
     *
     * 第一个*表示访问权限
     * 第二个表示类
     * 第三个* 表示方法
     * .. 表示任意类型的任意数量的参数
      */



    @Pointcut("execution(* com.gxa.ssm340.service.impl.*.*(..))")
    public void pointCut(){}





    /**
     * 环绕通知
     * 在执行时，需要通过执行连接点获取原方法
     */

    @Around("pointCut()")
    public Object around(ProceedingJoinPoint proceedingJoinPoint){
        Object proceed = null;

        try {
           //1.对目标方法进行判断：是否需要权限验证（根据方法注解）
            MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();
            //获取方法的反射目标Method
            Method method = signature.getMethod();
            RequiresPermission annotation = method.getAnnotation(RequiresPermission.class);

            //判断annotation是否为null，来判断该方法是否需要权限
            if(annotation != null){

                //执行权限的判断流程

                //如果校验不通过
                if(false){
                    throw  new BizException("你不具备访问权限");
                }
            }
            proceed = proceedingJoinPoint.proceed();


            return proceed;
        } catch (Throwable t) {


        }finally {


           
        }

        return proceed;
    }
}
